package com.ruoyi.framework.interceptor.loginInterceptor;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    // 有效期为（默认1小时）
    public static final Long JWT_TTL = 60 * 60 * 1000L; // 60 * 60 * 1000

    // 硬编码的 JWT 密钥
    public static final String JWT_KEY = "cereshuzhitingnizhenbangcereshuzhitingnizhenbang";

    /**
     * 创建 JWT token
     * @param id        token 的 ID
     * @param claims    封装的自定义数据
     * @param ttl       token 的过期时间（毫秒）
     * @return 生成的 JWT token
     */
    public static String createJWT(String id, Map<String, Object> claims, Long ttl) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if (ttl == null) {
            ttl = JWT_TTL;
        }
        long expMillis = nowMillis + ttl;
        Date expDate = new Date(expMillis);
        SecretKey secretKey = generalKey();

        JwtBuilder builder = Jwts.builder()
                .setId(id)                    // 唯一 ID
                .setSubject("woniu")          // 主题
                .setIssuer("woniu")           // 签发者
                .setIssuedAt(now)             // 签发时间
                .signWith(signatureAlgorithm, secretKey) // 签名算法和密钥
                .setExpiration(expDate);      // 过期时间
        builder.addClaims(claims);            // 添加自定义数据
        return builder.compact();
    }

    /**
     * 生成加密的 SecretKey
     * @return SecretKey 对象
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getEncoder().encode(JWT_KEY.getBytes());
        return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    }

    /**
     * 解析 JWT token
     * @param jwt JWT token
     * @return Claims 对象
     * @throws Exception 如果解析失败
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}